String Format使用指南

String Format 使用指南

输出 String 是一个我们常用的功能,用过使用 String Format 可以方便地格式化输出数值。Java SE 5.0 起沿用了 C 语言库函数的 printf 方法。

API

1
2
3
4
5
6
7
// String类 format 静态方法
public static String format(String format, Object... args)
public static String format(Locale l, String format, Object... args)
// PrintWriter类 printf 方法
public PrintWriter printf(String format, Object... args)
public PrintWriter printf(Locale l, String format, Object... args)
  • l - 使用特定的 local 使用 format 规则,可以为 null
  • format - 将要输出的字符串中的数值使用转换符替换。
  • args - 使用的数值。

常见的使用方法:

1
2
3
4
5
// 幅值格式化字符串
String string = String.format(String format, Object... args);
// 在控制台输出格式化字符串
System.out.printf(String format, Object... args);

举例:

1
2
System.out.printf("%s 您好,您的余额为%.2f元。", "王尼玛", 25431.5);
>>> 王尼玛 您好,您的余额为25431.50元。

Format 说明符语法

Format 说明符以 % 字符开始,再加上转换符以及其他标志组成。例如 %d 表示用整数替换,%s 表示用字符串替换。

转换符

全部的转换符如下:

转换符 类型
d 十进制整数
x 十六进制整数
o 八进制整数
f 定点浮点数
e 指数浮点数
g 通用浮点数
a 十六进制浮点数
s 字符串
c 字符
b 布尔值
h 哈希值(散列码)
tx 日期时间
Tx 大写日期时间(英语时有效)
% 百分号
n 行分隔符

整数类测试

  • d - 十进制整数

    1
    2
    System.out.printf("%d", 10);
    >>> 10
  • x - 十六进制整数

    1
    2
    System.out.printf("%x", 10);
    >>> a
  • o - 八进制整数

    1
    2
    System.out.printf("%o", 10);
    >>> 12

浮点数类测试

  • f - 定点浮点数

    1
    2
    System.out.printf("%f", 1000.0 / 3.0);
    >>> 333.333333
  • e - 指数浮点数

    1
    2
    System.out.printf("%e", 1000.0 / 3.0);
    >>> 3.333333e+02
  • g - 通用浮点数

    1
    2
    System.out.printf("%g", 1000.0 / 3.0);
    >>> 33.333
  • a - 十六进制浮点数

    1
    2
    System.out.printf("%a", 1000.0 / 3.0);
    >>> 0x1.4d55555555555p8

字符串与字符测试

  • s - 字符串

    1
    2
    System.out.printf("%s", "Hello");
    >>> Hello
  • c - 字符

    1
    2
    System.out.printf("%c", 'c');
    >>> c

布尔值测试

  • b - 布尔值

    1
    2
    System.out.printf("%b %b", true, false);
    >>> true false

哈希值(散列码)测试

  • h - 哈希值(散列码)

    1
    2
    System.out.printf("%h %h", "Hello", 'c', 10, 1000.0 / 3.0, true, false);
    >>> 42628b2 63 a 15218000 4cf 4d5

    ​得到的字符串即为对象的 hashCode() 返回值。

    例如,我们创建一个类 A ,并重写 hashCode() ,使其返回值为 "Hello".hashCode()

    1
    2
    3
    4
    5
    6
    class A {
    @Override
    public int hashCode() {
    return "Hello".hashCode();
    }
    }

    再通过 %h 格式化字符串:

    1
    2
    3
    A a = new A();
    System.out.printf("%h %h", a, "Hello");
    >>> 42628b2 42628b2

日期时间测试

  • tx - 日期时间

    x 为日期时间转换符,例如 c - 完整的日期和时间。

    1
    2
    3
    4
    5
    System.out.printf("%tc", new Date());
    >>> 星期四 四月 07 12:20:33 CST 2016
    System.out.printf(new Locale("En"), "%tc", new Date());
    >>> Thu Apr 07 17:43:17 CST 2016
  • Tx - 大写日期时间(英语)

    1
    2
    System.out.printf(new Locale("En"), "%Tc", new Date());
    >>> THU APR 07 17:43:17 CST 2016

完整的日期时间转换符如下:

转换符 类型
c 完整的日期和时间
F ISO 8601 日期
D 美国日期格式(月/日/年)
T 24小时,时分秒
r 12小时,时分秒
R 24小时,时分
Y 4位数字年,不足补0
y 年的后2位数字,不足补0
C 年的前2位数字,不足补0
B 月份的全拼
b 或 h 月份的缩写
m 2位数字月,不足补0
d 2位数字日,不足补0
e 2位数字日,不补0
A 星期的全拼
a 星期的缩写
j 3位数字年中第几日,不足补0
H 2位数字小时(0 ~ 23),不足补0
k 2位数字小时(0 ~ 23),不补0
I(大写i) 2位数字小时(0 ~ 12),不足补0
l(小写L) 2位数字小时(0 ~ 12),不补0
M 2位数字分钟,不足补0
S 2位数字秒,不足补0
L 3位数字毫秒,不足补0
N 9位数字微秒,不足补0
p 上午或下午
z 从GMT起,RFC822数字移位
Z 时区
s 距格林威治时间 1970-01-01 00:00:00 的秒数
Q 距格林威治时间 1970-01-01 00:00:00 的毫秒数

百分号与行分隔符

  • % - 百分号

    1
    2
    System.out.printf("%%");
    >>> %
  • n - 行分隔符

    1
    2
    3
    System.out.printf("line1%nline2");
    >>> line1
    line2